home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 3 / Cream of the Crop 3.iso / comm / wnos5src.zip / UDPDUMP.C < prev    next >
Text File  |  1993-10-14  |  4KB  |  177 lines

  1. /* UDP packet tracing
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  *
  4.  * ported to WNOS and enhancing with domain dump - DB3FL.92xxxx
  5.  * enhancements - G6DHU.92xxxx
  6.  *
  7.  */
  8. #include <stdio.h>
  9. #include "global.h"
  10. #include "config.h"
  11. #ifdef UDP
  12. #include "mbuf.h"
  13. #include "netuser.h"
  14. #include "internet.h"
  15. #include "udp.h"
  16. #include "ip.h"
  17. #include "socket.h"
  18. #include "trace.h"
  19. #include "domain.h"
  20.  
  21. static void near
  22. trput_rr(FILE *fp,struct rr *rrp)
  23. {
  24.     if(rrp == NULLRR) {
  25.         return;
  26.     }
  27.     trprintf(fp,"%s",rrp->name);
  28.  
  29.     if(rrp->name[strlen(rrp->name)-1] != '.' && rrp->origin != NULLCHAR) {
  30.         trprintf(fp,".%s",rrp->origin);
  31.     }
  32.     if(rrp->ttl) {
  33.         trprintf(fp," %lu",rrp->ttl);
  34.     }
  35.     if(rrp->class == CLASS_IN) {
  36.         trprintf(fp," IN");
  37.     } else {
  38.         if(rrp->ttl == 0) {
  39.             trprintf(fp," %lu",rrp->ttl);
  40.         }
  41.         trprintf(fp," %u",rrp->class);
  42.     }
  43.     if(rrp->type < NDTYPES) {
  44.         trprintf(fp," %s ",type2str(rrp->type));
  45.     } else {
  46.         trprintf(fp," %u ",rrp->type);
  47.     }
  48.     /* Null data portion, indicates nonexistent record */
  49.     if(rrp->rdlength != 0) {
  50.         switch(rrp->type) {
  51.         case TYPE_A:
  52.             trprintf(fp,"%s\n",inet_ntoa(rrp->rdata.addr));
  53.             return;
  54.         case TYPE_MINFO:    /* Unsupported type */
  55.             trprintf(fp,"%s %s\n",rrp->rdata.minfo.rmailbx,rrp->rdata.minfo.emailbx);
  56.             return;
  57.         case TYPE_MD:        /* Unsupported type */
  58.         case TYPE_MF:        /* Unsupported type */
  59.         case TYPE_NULL:        /* Unsupported type */
  60.         case TYPE_WKS:        /* Unsupported type */
  61.             trprintf(fp,"%s\n",rrp->rdata.data);
  62.             return;
  63.         case TYPE_CNAME:
  64.         case TYPE_MB:
  65.         case TYPE_MG:
  66.         case TYPE_MR:
  67.         case TYPE_NS:
  68.         case TYPE_PTR:
  69.         case TYPE_TXT:
  70.             /* These are all printable text strings */
  71.             trprintf(fp,"%s\n",rrp->rdata.data);
  72.             return;
  73.         case TYPE_MX:
  74.             trprintf(fp,"%u %s\n",rrp->rdata.mx.pref,rrp->rdata.mx.exch);
  75.             return;
  76.         case TYPE_SOA:
  77.             trprintf(fp,"%s %s %lu %lu %lu %lu %lu\n",
  78.                 rrp->rdata.soa->mname,rrp->rdata.soa->rname,
  79.                 rrp->rdata.soa->serial,rrp->rdata.soa->refresh,
  80.                 rrp->rdata.soa->retry,rrp->rdata.soa->expire,
  81.                 rrp->rdata.soa->minimum);
  82.             return;
  83.         case TYPE_HINFO:
  84.             trprintf(fp,"%s %s\n",rrp->rdata.hinfo.cpu,rrp->rdata.hinfo.os);
  85.         default:
  86.             return;
  87.         }
  88.     }
  89. }
  90.  
  91. /* Dump a UDP header */
  92. void
  93. udp_dump(FILE *fp,struct mbuf **bpp,int32 source,int32 dest,int check)
  94. {
  95.     struct udp udp;
  96.     struct pseudo_header ph;
  97.     int16 csum = 0;
  98.  
  99.     if(bpp == NULLBUFP || *bpp == NULLBUF) {
  100.         return;
  101.     }
  102.     /* Compute checksum */
  103.     ph.source = source;
  104.     ph.dest = dest;
  105.     ph.protocol = UDP_PTCL;
  106.     ph.length = len_p(*bpp);
  107.  
  108.     if(check) {
  109.         csum = cksum(&ph,*bpp,ph.length);
  110.     }
  111.     ntohudp(&udp,bpp);
  112.  
  113.     trprintf(fp,"UDP: len %u %u->%u",udp.length,udp.source,udp.dest);
  114.  
  115.     if(csum) {
  116.         trprintf(fp," CHECKSUM ERROR (%u)",csum);
  117.     }
  118.     trprintf(fp,"\n");
  119.  
  120.     if(udp.source == IPPORT_DOMAIN || udp.dest == IPPORT_DOMAIN) {
  121.         static char *Dopcode[] = {
  122.             "QUERY","IQUERY","STATUS","3a","4a","5a","6a","7a","8a","UPDATEA",
  123.             "UPDATED","UPDATEDA","UPDATEM","UPDATEMA","ZONEINIT","ZONEREF",
  124.         };
  125.         static char *Drcode[] = {
  126.             "NOERROR","FORMERR","SERVFAIL","NXDOMAIN","NOTIMP","REFUSED",
  127.             "6b","7b","8b","9b","10b","11b","12b","13b","14b","NOCHANGE",
  128.         };
  129.         int i;
  130.         struct dhdr *dhdr = mxallocw(sizeof(struct dhdr));
  131.  
  132.         ntohdomain(dhdr,bpp);
  133.  
  134.         trprintf(fp,"DOMAIN: opcode %s status %s id %lu",
  135.             Dopcode[dhdr->opcode],Drcode[dhdr->rcode],dhdr->id);
  136.  
  137.         trprintf(fp,"%s%s%s%s%s\n",
  138.             dhdr->aa ? " AA" : "",
  139.             dhdr->qr ? " QR" : "",
  140.             dhdr->rd ? " RD" : "",
  141.             dhdr->ra ? " RA" : "",
  142.             dhdr->tc ? " TC" : "");
  143.  
  144.         if(dhdr->qdcount) {
  145.             for(i = 0; i < dhdr->qdcount; i++) {
  146.                 struct quest *qp = dhdr->qlist[i];
  147.                 trprintf(fp,"        Quest%4d: name %s type %s class %s\n",
  148.                     i + 1,
  149.                     qp->qname,
  150.                     type2str(qp->qtype),
  151.                     qp->qclass == 1 ? "Internet" : "[unknown]");
  152.             }
  153.         }
  154.         if(dhdr->ancount) {
  155.             for(i = 0; i < dhdr->ancount; i++){
  156.                 trprintf(fp,"        Answer%3d: ",i + 1);
  157.                 trput_rr(fp,dhdr->ans[i]);
  158.             }
  159.         }
  160.         if(dhdr->nscount) {
  161.             for(i = 0; i < dhdr->nscount; i++){
  162.                 trprintf(fp,"        Author%3d: ",i + 1);
  163.                 trput_rr(fp,dhdr->ns[i]);
  164.             }
  165.         }
  166.         if(dhdr->arcount) {
  167.             for(i = 0; i < dhdr->arcount; i++){
  168.                 trprintf(fp,"        Addit%4d: ",i + 1);
  169.                 trput_rr(fp,dhdr->add[i]);
  170.             }
  171.         }
  172.         free_dhdr(dhdr);
  173.     }
  174.     return;
  175. }
  176. #endif /* UDP */
  177.